嗨,昨天講解了透過Scrapy
模擬登入!今天就要來講解如何爬取動態的網頁,什麼是動態網頁呢?前面我們介紹的都是去抓取靜態的網站頁面,也就是說我們打開某個鏈接,它的內容全部呈現出來,如果有爬過不同的網站就會發現,有時候雖然我們右鍵檢查網頁的時候明明有值,但爬的結果卻是為空值,這是因為現在大部分的web頁面都是動態的,是經過js渲染的,所以使用之前的方式是無法取得網頁內容的。
那該怎麼做呢?今天要來介紹 Splash!
Splash is a javascript rendering service. It’s a lightweight web browser with an HTTP API, implemented in Python 3 using Twisted and QT5.
Spalsh
提供JavaScript
渲染服務,它是一個使用Twisted
和QT5
在Python
中實現的支持HTTP API
調用的輕量級的web瀏覽器。
我們會用Docker
去執行它,因為主題的關係我不會對於docker
的操作多做說明,不過大家有興趣網路可以搜尋到很多有關Docker
的教學,所以我們就直接開始吧:
sudo docker pull scrapinghub/splash
sudo docker run -p 8050:8050 scrapinghub/splash
成功執行可以看到:
現在,該怎麼透過Scrapy
操作呢?就是使用scrapy-splash
,scrapy-splash
是為了方便scrapy
框架使用splash
而進行的封裝。
pip
安裝:
virtualenv
:source path/to/your/virtualenv/bin/activate
pip install scrapy-splash
前面我們已經有透過docker
開啟Splash
了,現在我們只需要修改程式碼,開啟settings.py
檔案:
SPLASH_URL = 'localhost:8050'
Splash
的middlewares
,並設置的順序:DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
好了,這樣settings.py
的部分就設定好了,要如何在spider
內使用呢?要使用Splash
對頁面進行渲染用SplashRequest
來取代scrapy
的Request
就行了,像是:
yield SplashRequest(url, self.parse_product,
args={
'wait': 0.5,
'http_method': 'GET'
}
)
http_method
為向url發送的HTTP的請求方式。wait
表示spalsh
在執行完成會等待一段時間後返回記得,前面要先import
:
from scrapy_splash import SplashRequest
到這裡就是要使用Scrapy-splash
基礎的設定跟Requests
方法了,更多詳細的內容可以看 GitHub - scrapy-plugins/scrapy-splash: Scrapy+Splash for JavaScript integration 上面的說明。
因為這週剛好遇上期中考,所以明天我們再說明爬取動態網頁的範例吧!請見諒 (._.) 那就明天見啦!
更多來源:
Installation — Splash 3.2 documentation
GitHub - scrapy-plugins/scrapy-splash: Scrapy+Splash for JavaScript integration
SPLASH_URL 前面要加 http:// 不然會得到 ValueError: Missing scheme in request url: render.html”
我不是很懂為什麼,這篇回答也沒說的很清楚,不過這樣是可以 work 的。